from django.shortcuts import render
from rest_framework.views import APIView
import random,logging
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework import status


from . import constants
from shopping_mall.libs.yuntongxun.sms import CCP
# from celery_tasks.sms.tasks import send_sms_code


# Create your views here.

logger = logging.getLogger('django')

class SMSCodeView(APIView):
    """发送短信验证码"""
    # def get(self,request,mobile):
    #     """
    #     GET  /sms_code/(?P<mobile>1[3-9]\d{9})
    #     :param request:
    #     :param mobile:
    #     :return:
    #     """
    #     # 生成短信验证码
    #     sms_code = '%06d' % random.randint(0, 999999)
    #     logger.info(sms_code)
    #
    #     # 保存短信验证码到redis
    #     redis_conn = get_redis_connection('verify_codes')
    #     # redis_conn.setex('key','过期时间','value')
    #     redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    #
    #     # 使用容联云通讯发送短信验证码
    #     CCP().send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES // 60],1)
    #
    #     # 响应结果
    #     return Response({'message':'OK'})

    """防止用户恶意获取验证码，设定６０ｓ发一次
    我们可以在第一次发送给客户短信的时候设定一个标记，时间６０ｓ
    在下次发送时首先判断该用户是否拥有标记，有的话就不发"""
    def get(self,request,mobile):
        """
        GET  /sms_code/(?P<mobile>1[3-9]\d{9})
        :param request:
        :param mobile:
        :return:
        """
        # １，先创建连接到redis的对象
        redis_conn = get_redis_connection('verify_codes')

        # 2,再判断用户在６０ｓ内是否重复发送短信
        # send_flag是我们做的标记，要和手机号匹配起来
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag:
            # 如果有send_flag的话，６０s内就不能重复发送短信
            return Response({'message':'频繁发送信息'},status=status.HTTP_400_BAD_REQUEST)
        # 生成短信验证码
        sms_code = '%06d' % random.randint(0, 999999)
        logger.info(sms_code)

        # redis管道：将多个redis指令放在同一个管道里面，统一执行，减少redis数据库的访问频率，提升性能
        pl = redis_conn.pipeline()

        # 保存短信验证码到redis
        # redis_conn.setex('key','过期时间','value')
        pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES,sms_code)

        # 代码运行到这里，肯定是第一次获取验证码，在redis中添加一个标记
        pl.setex('send_flag_%s' % mobile,constants.SEND_SMS_CODE_INTERVAL, 1)

        # 注意：一定要执行以下管道操作
        pl.execute()
        # 使用容联云通讯发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES // 60], 1)

        # 使用异步任务发送短信验证吗
        # send_sms_code.delay(mobile,sms_code)
        # 响应结果
        return Response({'message':'OK'})